import { createAlova } from 'alova';
import VueHook from 'alova/vue';
import adapterFetch from 'alova/fetch';
import { createAlovaMockAdapter } from '@alova/mock';
import { isString } from 'lodash-es';
import mocks from './mocks';
import { useUser } from '@/store/modules/user';
import { storage } from '@/utils/Storage';
import { useGlobSetting, useLocalSetting } from '@/hooks/setting';
import { PageEnum } from '@/enums/pageEnum';
import { ResultEnum } from '@/enums/httpEnum';
import { isUrl } from '@/utils';
// 1.1 引入auth
import { setToken, getToken, removeToken, getUserInfo, setUserInfo, removeUserInfo } from '@/utils/auth';



const { apiUrl, urlPrefix } = useGlobSetting();

const { useMock, loggerMock } = useLocalSetting();

const mockAdapter = createAlovaMockAdapter([...mocks], {
  // 全局控制是否启用mock接口，默认为true
  enable: useMock,

  // 非模拟请求适配器，用于未匹配mock接口时发送请求
  httpAdapter: adapterFetch(),

  // mock接口响应延迟，单位毫秒
  delay: 1000,

  // 自定义打印mock接口请求信息
  // mockRequestLogger: (res) => {
  //   loggerMock && console.log(`Mock Request ${res.url}`, res);
  // },
  mockRequestLogger: loggerMock,
  onMockError(error, currentMethod) {
    console.error('🚀 ~ onMockError ~ currentMethod:', currentMethod);
    console.error('🚀 ~ onMockError ~ error:', error);
  },
});

export const Alova = createAlova({
  baseURL: apiUrl,
  statesHook: VueHook,
  cacheLogger: process.env.NODE_ENV === 'development',
  requestAdapter: mockAdapter,
  beforeRequest(method) {
    const userStore = useUser();
    const token = userStore.getToken;
    // 添加 token 到请求头
    if (!method.meta?.ignoreToken && token) {
      method.config.headers['Authorization'] = token;
    }
    // 处理 api 请求前缀
    const isUrlStr = isUrl(method.url as string);
    if (!isUrlStr && urlPrefix) {
      method.url = `${urlPrefix}${method.url}`;
    }
    if (!isUrlStr && apiUrl && isString(apiUrl)) {
      method.url = `${apiUrl}${method.url}`;
    }

    // 👇 新增：如果是 POST 请求，并且未指定 content-type，则自动设置为 form 表单
    if (method.type === 'POST' && !method.config.headers['Content-Type']) {
      method.config.headers['Content-Type'] = 'application/x-www-form-urlencoded';

      // 自动转换数据为 URLSearchParams
      if (method.data && typeof method.data === 'object' && method.data.params) {
        const params = new URLSearchParams();
        for (const [key, value] of Object.entries(method.data.params)) {
          params.append(key, value as string);
        }
        method.data = params;
      }
    }
     // 👇 修改：支持 formData 提交数据
  // if (method.type === 'POST' && !method.config.headers['Content-Type']) {
  //   method.config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
    
  //   // 自动转换数据为 URLSearchParams (formData 格式)
  //   if (method.data && typeof method.data === 'object') {
  //     const params = new URLSearchParams();
  //     for (const [key, value] of Object.entries(method.data)) {
  //       params.append(key, String(value));
  //     }
  //     method.data = params;
  //   }
  // }
 // 支持 formData 提交数据
//  if (method.type === 'POST' && !method.config.headers['Content-Type']) {
//   method.config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  
//   // 直接转换为字符串格式
//   if (method.data && typeof method.data === 'object') {
//     const paramsArray = [];
//     for (const [key, value] of Object.entries(method.data.params)) {
//       paramsArray.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`);
//     }
//     method.data = paramsArray.join('&');

//     // 用于调试，可以在控制台看到实际的参数字符串
//     console.log('FormData params:', method.data.toString());
//   }
  // }

  
  // 如果需要强制使用 formData，可以通过 meta 标记
  // if (method.meta?.isFormData) {
  //   method.config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
  //   if (method.data && typeof method.data === 'object') {
  //     const params = new URLSearchParams();
  //     for (const [key, value] of Object.entries(method.data)) {
  //       params.append(key, String(value));
  //     }
  //     method.data = params;
  //   }
  // }

  },
  responded: {
    onSuccess: async (response, method) => {
      const res = (response.json && (await response.json())) || response.body;

      // 是否返回原生响应头 比如：需要获取响应头时使用该属性
      if (method.meta?.isReturnNativeResponse) {
        return res;
      }
      // 请根据自身情况修改数据结构
      const { sucMsg, errMsg, encrypt, code, data } = res;

      // 不进行任何处理，直接返回
      // 用于需要直接获取 code、result、 message 这些信息时开启
      if (method.meta?.isTransformResponse === false) {
        return res.data;
      }

      // @ts-ignore
      const Message = window.$message;
      // @ts-ignore
      const Modal = window.$dialog;

      const LoginPath = PageEnum.BASE_LOGIN;
      if (ResultEnum.SUCCESS === code) {
        // 这里不应该返回未定义的结果;应该返回data
        return data;
        // return result;
      }
      // 需要登录
      if (code === 912) {
        Modal?.warning({
          title: '提示',
          content: '登录身份已失效，请重新登录!',
          okText: '确定',
          closable: false,
          maskClosable: false,
          onOk: async () => {
            storage.clear();
            window.location.href = LoginPath;
          },
        });
      } else {
        // 可按需处理错误 一般情况下不是 912 错误，不一定需要弹出 message
        Message?.error(errMsg);
        throw new Error(errMsg);
      }
    },
  },
});


// 项目，多个不同 api 地址，可导出多个实例
// export const AlovaTwo = createAlova({
//   baseURL: 'http://localhost:9001',
// });
